﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Hotel_Project.Tools.MySqlData_Helps
{
    internal class MySqlGetList
    {
        public static List<T> GetDataList<T>(DataTable da)
        {
            List<T> list = new List<T>();//0
            Type type = typeof(T);//获取你传入的T类型的类型
            PropertyInfo[] p = type.GetProperties();//获取到你传入的类里面的属性
            //先判断你传入的类与你Sql语句查询的表的列数是不是相同
            if (p.Length != da.Columns.Count)
            {
                throw new Exception("类中属性与表中的列数不一致", new Exception());
            }
            for (int j = 0; j < da.Rows.Count; j++)//判断表中有多少行的数据，就决定着List中就有多少数据
            {
                T t = (T)Activator.CreateInstance(type, true);//将你传入的类进行实例化，以便后面List集合add数据
                for (int i = 0; i < da.Columns.Count; i++)//判断表中有多少列，也就是对应传入的类中有多少属性，因为属性与表中的列挂钩
                {
                    if (p[i].Name.ToString().ToLower() == da.Columns[i].ToString().ToLower())//将表中的列名与属性名相比较，看是不是同一个属性
                    {
                        try
                        {
                            p[i].SetValue(t, da.Rows[j][i].ToString());//通过SetValue将值放到传入的对象属性里，t就是目标，也就是你传入的对象，然后就是数据
                        }
                        catch (System.ArgumentException e)//转换int类型
                        {
                            p[i].SetValue(t, Convert.ToInt32(da.Rows[j][i].ToString()));//通过SetValue将值放到传入的对象属性里，t就是目标，也就是你传入的对象，然后就是数据
                        }
                    }
                }
                list.Add(t);
            }
            return list;
        }
    }
}
